package com.example.reflectdemo.base;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

public class ReflectDomo {
    private static final String[] ANIMAL_TYPES = new String[]{
            "com.example.reflectdemo.base.Cat",
            "com.example.reflectdemo.base.Elephant",
            "com.example.reflectdemo.base.Dog"
    };

    public static void main(String... args){
        List<Object> animals = createAnimals();
        for (Object animal : animals){
            System.out.println(invokeGetType(animal));
        }

    }

    /**
     * 利用反射API执行getType方法
     * @param animal
     * @return
     */
    private static String invokeGetType(Object animal){
        try {
            Method getTypeMethod = Animal.class.getMethod("getType");
            return (String) getTypeMethod.invoke(animal);
        }catch (Exception e){
            return null;
        }

    }

    /**
     * 反射允许我们在运行时获取类型信息
     * @return
     */
    private static List<Object> createAnimals() {
        List<Object> animals = new ArrayList<>();
        for (String cls : ANIMAL_TYPES){
            animals.add(instanceByReflect(cls));
        }
        return animals;
    }

    /**
     * 使用反射机制，在运行时动态的实例化对象(等同于new关键字)
     * @param clsStr
     * @return
     */
    private static Object instanceByReflect(String clsStr) {
        try {
            // 通过反射获取类型信息
            Class cls = Class.forName(clsStr);
            // 通过Class实例化对象
            Object object = cls.newInstance();
            return object;
        }catch (Exception e){
            e.printStackTrace();
            return null;
        }

    }
}
